package com.example.algorithm.huawei_rongyao_29;
import java.util.Scanner;

// 密码验证合格程序
// 难度：中等。仅仅检查重复子串难一些。
/**
 * 密码要求:
 * 1.长度超过8位
 * 2.包括大小写字母.数字.其它符号,以上四种至少三种
 * 3.不能有长度大于2的、不含公共元素的子串重复 （注：其他符号不含空格或换行）
 * 数据范围：输入的字符串长度满足1<=n<=100
 *
 * 输入描述:
 * 一组字符串。
 *
 * 输出描述:
 * 如果符合要求输出：OK，否则输出NG
 *
 * 示例1
 * 输入
 * 021Abc9000
 * 021Abc9Abc1
 * 021ABC9000
 * 021$bc9000
 *
 * 输出
 * OK
 * NG
 * NG
 * OK
 *
 * 要实现密码验证的功能，我们需要根据给定的要求对输入的字符串进行一系列检查。具体的步骤如下：
 * 检查密码长度是否超过8位。
 * 检查密码是否包含大小写字母、数字和其他符号这四种字符中的至少三种。
 * 检查密码中是否存在长度大于2且不含公共元素的子串重复。
 *
 * 实际测试一下程序运行结果正确。
 * */
public class Q24_PasswordValidator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()) {
            String password = scanner.nextLine();

            if (isValidPassword(password)) {
                System.out.println("OK");
            } else {
                System.out.println("NG");
            }
        }
    }

    private static boolean isValidPassword(String password) {

        if (password.length() <= 8) {
            return false;
        }

        if (!hasRequiredCharacterTypes(password)) {
            return false;
        }

        if (hasRepeatingSubstrings(password)) {
            return false;
        }

        return true;
    }

    private static boolean hasRequiredCharacterTypes(String password) {
        // 四个标记
        boolean hasUpper = false;
        boolean hasLower = false;
        boolean hasDigit = false;
        boolean hasOther = false;

        for (char c : password.toCharArray()) {
            if (Character.isUpperCase(c)) {
                hasUpper = true;
            } else if (Character.isLowerCase(c)) {
                hasLower = true;
            } else if (Character.isDigit(c)) {
                hasDigit = true;
            } else {
                hasOther = true;
            }
        }

        int count = 0;
        if (hasUpper) count++;
        if (hasLower) count++;
        if (hasDigit) count++;
        if (hasOther) count++;

        // 标记总数大于等于3就行
        return count >= 3;
    }

    // 这个没看太懂
    private static boolean hasRepeatingSubstrings(String password) {
        int length = password.length();
        for (int i = 0; i < length - 2; i++) {
            String substring = password.substring(i, i + 3);
            if (password.indexOf(substring, i + 3) != -1) {
                return true;
            }
        }
        return false;
    }
}

